#include "base_server.cpp"

//一个客户端一个子进程server
//流程：
//1、主进程create,bind,listen,然后阻塞在accept
//2、客户端connect上来后，服务器fork一个子进程去处理，然后主进程继续accept等待下一个客户端

//缺点
//1、没法复用fd
//2、fork开销
int main(){

    int listenfd, connfd;
    pid_t childPid;
    int port = 9010;
    void sig_child(int), sig_init(int), web_child(int);
    socklen_t clilen, addrlen;
    struct sockaddr *cliaddr; 

    listenfd = tcp_create_bind_listen(9010);

    signal(SIGCHLD, sig_child);
    signal(SIGINT, sig_init);

    //这个for应该 是无限循环，为了测试改为了有限数量
    for(int i = 0; i < 10000; i++){
        clilen = sizeof(cliaddr);
        connfd = accept(listenfd, cliaddr, &clilen);
        if(connfd < 0){
            printf("accept error\n");
            continue;
            //error_func("accept error");
        }

        childPid = fork();
        if(childPid == 0){
            close(listenfd);
            web_child(connfd);
            exit(0);
        }

        close(connfd);
    }

    return 0;
}

void sig_child(int signo){
    printf("sign handle SIGCHLD\n");
    wait(NULL);
}

void sig_init(int signo){
    printf("sign handle SIGINT\n");
    wait(NULL);
    exit(0);
}

void web_child(int connfd){
    // sleep(3);

    char sendBuff[1025] = "你好呀，连接成功";
    write(connfd, sendBuff, strlen(sendBuff));

    // char buffer[256];
    // int n=0;
    // bzero(buffer, 256);
    // n = read(connfd, buffer, 255);
    // if(n < 0){
    //     error_func("read socket失败", n);
    // }
    // printf("web handle read(fd, buffer, num):%s\n", buffer);

}

